{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "dc4309d9-385a-45e4-bbe8-a18f2d12887a",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Users\\MECHREVO\\anaconda3\\Lib\\site-packages\\torch\\utils\\_pytree.py:185: FutureWarning: optree is installed but the version is too old to support PyTorch Dynamo in C++ pytree. C++ pytree support is disabled. Please consider upgrading optree using `python3 -m pip install --upgrade 'optree>=0.13.0'`.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "import torch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "52f759bb-f5f8-4081-866c-ab57abdaf348",
   "metadata": {},
   "outputs": [],
   "source": [
    "from transformers import AutoTokenizer\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "c79bc59a-33f3-4e66-a18a-06ef237ba67a",
   "metadata": {},
   "outputs": [],
   "source": [
    "tokenizer_gpt2 = AutoTokenizer.from_pretrained('gpt2')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "481122b5-8172-4b5f-a8bc-425c3ce04a9f",
   "metadata": {},
   "outputs": [],
   "source": [
    "text_zh = '''埃瓦里斯特·伽罗瓦（Évariste Galois，1811年10月25日－1832年5月31日），法国数学家，现代数学中的分支学科群论的创立者。他用群论彻底解决了根式求解代数方程的问题，并由此发展了一整套关于群和域的理论，人们称之为伽罗瓦理论。伽罗瓦在世时，他的数学研究成果的重要性并未被人们所认识，他曾向科学院提交的三篇学术论文均被退回或遗失。后来，他转向政治，支持共和党，曾两次被捕。21岁时，他在一次决斗中丧生。'''\n",
    "text_en = '''Evariste Galois (October 25, 1811 – May 31, 1832) was a French mathematician and the founder of the branch of modern mathematics known as group theory. He used group theory to completely solve the problem of solving algebraic equations by radicals and developed a whole set of theories about groups and fields, which came to be known as Galois theory. During his lifetime, the significance of Galois' mathematical research was not recognized, and the three academic papers he submitted to the Academy of Sciences were all rejected or lost. Later, he turned to politics, supported the Republican Party, and was arrested twice. At the age of 21, he was killed in a duel. '''\n",
    "text_fr = '''Évariste Galois (25 octobre 1811 – 31 mai 1832) était un mathématicien français et le fondateur de la branche de la mathématique moderne connue sous le nom de théorie des groupes. Il a utilisé la théorie des groupes pour résoudre complètement le problème de la résolution d'équations algébriques par radicaux et a développé un ensemble de théories sur les groupes et les corps, qui sont devenues connues sous le nom de théorie de Galois. Au cours de sa vie, l'importance des recherches mathématiques de Galois n'a pas été reconnue, et les trois articles académiques qu'il avait soumis à l'Académie des sciences ont tous été rejetés ou perdus. Plus tard, il s'est tourné vers la politique, a soutenu le Parti républicain et a été arrêté deux fois. À l'âge de 21 ans, il a été tué dans un duel.'''\n",
    "texts = {\n",
    "    'fr' : text_fr,\n",
    "    'zh': text_zh,\n",
    "    'en': text_en\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "384be67b-741a-40a7-a2d7-bbb0be1b3e1a",
   "metadata": {},
   "source": [
    "## 分词器最重要的两个性质\n",
    "- 编码 encode\n",
    "- 解码 decode"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "79a119c1-1422-4be4-9703-9354cb08b94c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"E_var_iste_ Gal_ois_ (_October_ 25_,_ 18_11_ –_ May_ 31_,_ 18_32_)_ was_ a_ French_ mathematician_ and_ the_ founder_ of_ the_ branch_ of_ modern_ mathematics_ known_ as_ group_ theory_._ He_ used_ group_ theory_ to_ completely_ solve_ the_ problem_ of_ solving_ algebra_ic_ equations_ by_ radicals_ and_ developed_ a_ whole_ set_ of_ theories_ about_ groups_ and_ fields_,_ which_ came_ to_ be_ known_ as_ Gal_ois_ theory_._ During_ his_ lifetime_,_ the_ significance_ of_ Gal_ois_'_ mathematical_ research_ was_ not_ recognized_,_ and_ the_ three_ academic_ papers_ he_ submitted_ to_ the_ Academy_ of_ Sciences_ were_ all_ rejected_ or_ lost_._ Later_,_ he_ turned_ to_ politics_,_ supported_ the_ Republican_ Party_,_ and_ was_ arrested_ twice_._ At_ the_ age_ of_ 21_,_ he_ was_ killed_ in_ a_ duel_._ \""
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "re = tokenizer_gpt2.encode(text_en)\n",
    "# 打印英文分词效果\n",
    "'_'.join([tokenizer_gpt2.decode(i) for i in tokenizer_gpt2.encode(text_en)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "3d29c2ec-97c4-4073-8e65-338e06855878",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"É_var_iste_ Gal_ois_ (_25_ oct_ob_re_ 18_11_ –_ 31_ m_ai_ 18_32_)_ _ét_ait_ un_ math_é_matic_ien_ fr_an_ç_ais_ et_ le_ fond_ateur_ de_ la_ br_anche_ de_ la_ math_é_mat_ique_ moder_ne_ conn_ue_ s_ous_ le_ nom_ de_ th_é_orie_ des_ group_es_._ Il_ a_ util_is_é_ la_ th_é_orie_ des_ group_es_ pour_ r_és_oud_re_ compl_è_t_ement_ le_ prob_l_è_me_ de_ la_ r_és_olution_ d_'_é_qu_ations_ al_g_é_b_ri_ques_ par_ rad_ic_aux_ et_ a_ dé_vel_opp_é_ un_ ensemble_ de_ th_é_ories_ sur_ les_ group_es_ et_ les_ corps_,_ qui_ s_ont_ de_ven_ues_ conn_ues_ s_ous_ le_ nom_ de_ th_é_orie_ de_ Gal_ois_._ Au_ cour_s_ de_ sa_ v_ie_,_ l_'_import_ance_ des_ rec_her_ches_ math_é_mat_iques_ de_ Gal_ois_ n_'_a_ pas_ _ét_é_ recon_n_ue_,_ et_ les_ tro_is_ articles_ acad_é_m_iques_ qu_'_il_ av_ait_ sou_mis_ à_ l_'_Ac_ad_é_mie_ des_ sciences_ ont_ t_ous_ _ét_é_ re_jet_és_ o_u_ per_d_us_._ Plus_ t_ard_,_ il_ s_'_est_ t_ourn_é_ vers_ la_ polit_ique_,_ a_ s_out_en_u_ le_ Part_i_ ré_public_ain_ et_ a_ _ét_é_ arr_ê_t_é_ de_ux_ f_ois_._ �_�_ l_'_â_ge_ de_ 21_ ans_,_ il_ a_ _ét_é_ tu_é_ d_ans_ un_ duel_.\""
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 打印法语分词效果\n",
    "'_'.join([tokenizer_gpt2.decode(i) for i in tokenizer_gpt2.encode(text_fr)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "366b7503-1597-4b25-aaba-9b81298f9631",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'�_�_�_�_�_�_�_�_�_�_�_�_·_�_�_�_�_�_�_�_�_�_�_�_É_var_iste_ Gal_ois_�_�_�_18_11_�_�_10_�_�_25_�_�_�_�_�_18_32_�_�_5_�_�_31_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_代_�_�_�_�_中_的_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_的_�_�_�_�_者_。_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_代_�_�_方_�_�_�_的_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_一_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_的_�_�_�_�_�_�_�_�_人_�_�_�_�_�_之_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_。_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_的_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_的_�_�_�_�_�_�_�_�_�_�_�_�_�_人_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_的_三_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_。_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_。_21_�_�_�_�_�_�_�_�_�_�_�_�_一_�_�_�_�_�_�_�_中_�_�_生_。'"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 打印中文分词效果\n",
    "'_'.join([tokenizer_gpt2.decode(i) for i in tokenizer_gpt2.encode(text_zh)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "883f806f-bebc-48ae-b891-dc61e5f0bcc7",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_token_stats(tokenizer):\n",
    "    str_stats = {}\n",
    "    token_stats = {}\n",
    "    for (k,v) in texts.items():\n",
    "        str_stats[k] = len(v.split()) if k != 'zh' else len(v)\n",
    "        token_stats[k] = len(tokenizer.encode(v))\n",
    "    return str_stats,token_stats"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "98c2583c-0a41-4cc8-9d5a-6062f62a27ac",
   "metadata": {},
   "outputs": [],
   "source": [
    "str_stats,token_stats = get_token_stats(tokenizer_gpt2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "b1d87824-958a-47b2-9670-ff12842a43b2",
   "metadata": {},
   "outputs": [],
   "source": [
    "def draw_bar(str_stats, token_stats):\n",
    "    #将统计结果可视化\n",
    "    fig =plt.figure(figsize=(6,6),dpi=80)\n",
    "    plt.rcParams['font.sans-serif']=['SimHei']\n",
    "    plt.rcParams['axes.unicode_minus']=False\n",
    "    plt.rcParams.update({'font.size':13})\n",
    "    bar_width=0.1\n",
    "    base = range(len(str_stats))\n",
    "    br_str=[x-bar_width for x in base]\n",
    "    br_token =[x+ bar_width for x in base]\n",
    "    plt.bar(br_str,str_stats.values(), color ='g',\n",
    "    width=bar_width*2,label='文本长度')\n",
    "    plt.bar(br_token,token_stats.values(),color ='b',\n",
    "    width=bar_width*2,label='分词后的长度')\n",
    "    plt.xticks([r for r in base],str_stats.keys(),fontsize=18)\n",
    "    plt.legend(shadow=True)\n",
    "    return fig"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "722f8b7a-bb7d-45a0-a15b-1d84db9cff3a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaEAAAGYCAYAAADr3V2nAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAAxOAAAMTgF/d4wjAAAy5ElEQVR4nO3df1wVdaL/8feRg+eIKAchSThpgCFpXopqMW+L1pq64I+MQvdqi7k90n7s3pJK95HrlpptaqSSZJZs/mhrK2+65qY+vNlV2UWRAle9mpluoAlmCoIICPP9g69zO8sPQcARej0fj3no+Xxm5vMZGM/bmfnMjM0wDEMAAFigg9UdAAD8eBFCAADLEEIAAMsQQgAAyxBCAADLEEIAAMsQQgAAy9it7kB9HA6HrrnmGqu7AQBoppMnT6q8vLzOuqs2hK655hrl5+db3Q0AQDO53e566zgdBwCwDCEEALAMIQQAsAwhBACwzFU7MAHA1aOqqsrqLuAq5OXl1ex1EEIA6lVYWKjjx48TQqiTl5eXgoOD1b1798teByEEoE6FhYU6duyYwsLC1LlzZ9lsNqu7hKuIYRgqLS3V4cOH9d133yksLExOp7PJ6yGEANTp+PHjCgsLk5+fn9VdwVXKz89P4eHhOnjwoNauXatRo0bJx8enSetgYAKAWqqqqlRVVaXOnTtb3RVc5Tp37iwvLy+dOHFCGzdubPLyhBCAenEKDpdycR8JCAhQfn5+k68fEkIAgGbz8vLShQsXVFlZ2aTlCCEAPwp/+9vfdM8996i6urrJy/bq1Utr165t1LzHjx+XzWbTt99+61G+ZMkSvfzyy41uc/369fr444+b0s02iYEJAJrE9sKVP0Vn/N5o9jqio6N1+PBhvfnmm5o8eXKTlnU4HHI4HI2at1OnTpLkMVIsNzdXzzzzjCZOnNjoNnfv3q33339fI0aMkFQzGq2iokIdOnSQt7d34zt/leNICEC7U11drXPnzunChQtmmdPp1Lx583T8+PFa81dWVur8+fOqrq5WeXm5DMMz9Dp06FDr+lhVVZUqKipqrevifBf/LCws1JgxYzRq1CgtWbKkzv7OmjVLnTt3ltvtNqfly5fr7NmzHmUhISFatWpV034YVzmOhAC0O3v27NEtt9xSb/2sWbNqlSUlJemJJ57Q7bffro4dO5ohUlFRIcMw9POf/9yjvKqqSsOHD9f69evrbae4uFjx8fEKDQ3VypUr6x3o4XA4NHbsWKWnp0uS0tLSNG7cOHXr1k2StGLFCt1666266aabGvcDaEMIIcBCV3rwmdH8s1ptQr9+/fT999+rc+fOevXVV7V161atXr3aY57Y2Fj9+te/VkJCgqqqqtSxY0cFBAR4HAUVFRXpuuuuU4cOHdSxY0e98sorevDBB836fz1i+lejR4/WhQsX9NFHH6ljx44NztuhQweVlZXJ4XBo+vTpGj58uBlCy5cvl8PhUJ8+fWQYxiXX1ZZwOg5Au+Pt7S1/f3917NhRcXFx+uKLL9StWzcFBgYqMDBQNptNX375pYYPH67u3burR48eCggIqLWelStX6u6779a1116rsWPHauXKlR71F49sKisrVVBQoDNnzqioqEhSTYA99thjevfdd1VdXa0zZ86YU2Fhoc6ePWuuxzAM2e123X333YqMjFRpaanuueceRUZGKjIyUrt371ZycrL69u2r5cuXt+JP7srjSAhAu9a/f38FBwdr48aNiouLkyT96U9/0k9+8hOFhobWu1xZWZleeeUVrVy5Uo888oiGDRumdevWKSsrS7fffrvHvF9++aWioqLkcDjMYOrXr58k6dy5c3I6nerQoeb//BcHGMyZM0fTpk2TJJ0/f14Oh0N///vfJUldunRRenq6QkJCJEnjx4/X008/rQceeKAFfzJXB0IIQLs3depUzZw5U8OHD1dFRYXmz5+vBQsWNLjMH/7wB91yyy2KjY2VJNntds2dO1ePPfaYMjIyPE6J9evXzxwEcebMGfn7+ys/P18ul0sjRoxQbGysnn322XrbKi0t9TgSe+SRR/TRRx+Zn++44w6FhYVd1rZf7QghAO3ehAkTtGTJEv3+979XaWmp3G53g0cVW7duVVpamnbt2uVRPn78eK1atUqTJk3SypUrzaObhjz++ONKSkrSpEmTFBgYWOc8J06cUEREhGbMmKG3335bFy5ckMvlMuvLy8u1detWbd++XV27dm3cRrcRTb4mNGXKFHOse0VFhSZPniyXy6X+/fvX+oWlpaUpJCREwcHB5qgPALjSbDab3n//fS1evFivvfaa3n777XpHquXk5OiBBx7Q0qVL1b17d/MIp7q6WhUVFXrrrbeUm5ur++67z7z+05ChQ4cqOjpaEyZMqPdpAl9/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qk+fPrLZbLrttttUUlJSa7rtttvqXOfF+n379pllvr6+euKJJ/TKK69Iqjl6acyTZx5//HEtWLBA3333Xb3znDhxQj169NCMGTPkdrv1zjvvaOPGjea0bt06TZo0qdZ9Sy2NEALQ7u3fv185OTkaOnSoWXbs2DEFBATU+84hwzA0f/58VVVVacuWLbr22msVHh7u8fqaHzp69KhKS0vVv3//SwZXU4Jt0qRJioqKUlVVlUpLS+Xn53fJZYYOHaro6GhNmDCh3nt8vv76a4WEhGjOnDnKz89XVFSUkpOTdeDAAWVmZsrb21uzZs1S165dG93Xy8HpOADtWlFRkSZOnKikpCSPo55jx47puuuuq3MZwzD07LPPyjAMhYeHa8iQIebpuB++3POHVq1apbvuukt2u71JIXMpISEh5r0+RUVF6t27d73zlpeXa9q0afryyy+1YsUK3X777YqLi9M777zj8eK+s2fPavfu3br99tvNsvT0dMXGxqq8vFzvvPOOHnzwQfPV5K2JEALQJC34BJtWl5OTowcffFDXXXedUlNTJdXcyHnkyBG9/fbb6tu3b61lzp49q4KCAvXq1UubNm3SqVOnzHtnOnfurP3790uqOTV2MWyOHDmiV199VUuXLpVUcy/R3/72tzoD6/vvv9eUKVPMzxePrC6eZvvhPUk/ZBiG/vGPf9T5Spxz585JqrmO4+XlpQULFigoKEj/8z//o5EjR6pPnz569tln9eijj8rlcmnFihWKjo7WNddcY66jpKREd955p37961+rR48eioiIUH5+voKDg+vsT0vhdByAdum9995TTEyMRowYoXXr1pmPtikrK9OYMWNkt9s9nhF30fHjxxUZGam1a9eqU6dOcrvd5kOabTabevbsqeeee06/+MUvdOONN0qS/P39tWDBAt1///2SagY9DBw40Ly36IfTwIEDVVJSYrZXWVkph8Oh8+fP6/z58/r666/Vs2dPs/7YsWO68847df3118vhcHicUrwoIyNDkjR8+HDt2bPHPIIJDQ1Vdna2pkyZoszMTDPoDhw4oMcff1wff/yxhg0bJrfbrXHjxunGG2/UwYMHNW/ePK1Zs0YxMTHq2LGjwsLCdPr06eb+SupkM1ryyXwtyO12Kz8/3+puAK2qBc/aNEpj/7VXVVWZF/K9vLxat1Ot6NixY+aQ46aorKys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",
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaEAAAGYCAYAAADr3V2nAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAAxOAAAMTgF/d4wjAAAy5ElEQVR4nO3df1wVdaL/8feRg+eIKAchSThpgCFpXopqMW+L1pq64I+MQvdqi7k90n7s3pJK95HrlpptaqSSZJZs/mhrK2+65qY+vNlV2UWRAle9mpluoAlmCoIICPP9g69zO8sPQcARej0fj3no+Xxm5vMZGM/bmfnMjM0wDEMAAFigg9UdAAD8eBFCAADLEEIAAMsQQgAAyxBCAADLEEIAAMsQQgAAy9it7kB9HA6HrrnmGqu7AQBoppMnT6q8vLzOuqs2hK655hrl5+db3Q0AQDO53e566zgdBwCwDCEEALAMIQQAsAwhBACwzFU7MAHA1aOqqsrqLuAq5OXl1ex1EEIA6lVYWKjjx48TQqiTl5eXgoOD1b1798teByEEoE6FhYU6duyYwsLC1LlzZ9lsNqu7hKuIYRgqLS3V4cOH9d133yksLExOp7PJ6yGEANTp+PHjCgsLk5+fn9VdwVXKz89P4eHhOnjwoNauXatRo0bJx8enSetgYAKAWqqqqlRVVaXOnTtb3RVc5Tp37iwvLy+dOHFCGzdubPLyhBCAenEKDpdycR8JCAhQfn5+k68fEkIAgGbz8vLShQsXVFlZ2aTlCCEAPwp/+9vfdM8996i6urrJy/bq1Utr165t1LzHjx+XzWbTt99+61G+ZMkSvfzyy41uc/369fr444+b0s02iYEJAJrE9sKVP0Vn/N5o9jqio6N1+PBhvfnmm5o8eXKTlnU4HHI4HI2at1OnTpLkMVIsNzdXzzzzjCZOnNjoNnfv3q33339fI0aMkFQzGq2iokIdOnSQt7d34zt/leNICEC7U11drXPnzunChQtmmdPp1Lx583T8+PFa81dWVur8+fOqrq5WeXm5DMMz9Dp06FDr+lhVVZUqKipqrevifBf/LCws1JgxYzRq1CgtWbKkzv7OmjVLnTt3ltvtNqfly5fr7NmzHmUhISFatWpV034YVzmOhAC0O3v27NEtt9xSb/2sWbNqlSUlJemJJ57Q7bffro4dO5ohUlFRIcMw9POf/9yjvKqqSsOHD9f69evrbae4uFjx8fEKDQ3VypUr6x3o4XA4NHbsWKWnp0uS0tLSNG7cOHXr1k2StGLFCt1666266aabGvcDaEMIIcBCV3rwmdH8s1ptQr9+/fT999+rc+fOevXVV7V161atXr3aY57Y2Fj9+te/VkJCgqqqqtSxY0cFBAR4HAUVFRXpuuuuU4cOHdSxY0e98sorevDBB836fz1i+lejR4/WhQsX9NFHH6ljx44NztuhQweVlZXJ4XBo+vTpGj58uBlCy5cvl8PhUJ8+fWQYxiXX1ZZwOg5Au+Pt7S1/f3917NhRcXFx+uKLL9StWzcFBgYqMDBQNptNX375pYYPH67u3burR48eCggIqLWelStX6u6779a1116rsWPHauXKlR71F49sKisrVVBQoDNnzqioqEhSTYA99thjevfdd1VdXa0zZ86YU2Fhoc6ePWuuxzAM2e123X333YqMjFRpaanuueceRUZGKjIyUrt371ZycrL69u2r5cuXt+JP7srjSAhAu9a/f38FBwdr48aNiouLkyT96U9/0k9+8hOFhobWu1xZWZleeeUVrVy5Uo888oiGDRumdevWKSsrS7fffrvHvF9++aWioqLkcDjMYOrXr58k6dy5c3I6nerQoeb//BcHGMyZM0fTpk2TJJ0/f14Oh0N///vfJUldunRRenq6QkJCJEnjx4/X008/rQceeKAFfzJXB0IIQLs3depUzZw5U8OHD1dFRYXmz5+vBQsWNLjMH/7wB91yyy2KjY2VJNntds2dO1ePPfaYMjIyPE6J9evXzxwEcebMGfn7+ys/P18ul0sjRoxQbGysnn322XrbKi0t9TgSe+SRR/TRRx+Zn++44w6FhYVd1rZf7QghAO3ehAkTtGTJEv3+979XaWmp3G53g0cVW7duVVpamnbt2uVRPn78eK1atUqTJk3SypUrzaObhjz++ONKSkrSpEmTFBgYWOc8J06cUEREhGbMmKG3335bFy5ckMvlMuvLy8u1detWbd++XV27dm3cRrcRTb4mNGXKFHOse0VFhSZPniyXy6X+/fvX+oWlpaUpJCREwcHB5qgPALjSbDab3n//fS1evFivvfaa3n777XpHquXk5OiBBx7Q0qVL1b17d/MIp7q6WhUVFXrrrbeUm5ur++67z7z+05ChQ4cqOjpaEyZMqPdpAl9/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qk+fPrLZbLrttttUUlJSa7rtttvqXOfF+n379pllvr6+euKJJ/TKK69Iqjl6acyTZx5//HEtWLBA3333Xb3znDhxQj169NCMGTPkdrv1zjvvaOPGjea0bt06TZo0qdZ9Sy2NEALQ7u3fv185OTkaOnSoWXbs2DEFBATU+84hwzA0f/58VVVVacuWLbr22msVHh7u8fqaHzp69KhKS0vVv3//SwZXU4Jt0qRJioqKUlVVlUpLS+Xn53fJZYYOHaro6GhNmDCh3nt8vv76a4WEhGjOnDnKz89XVFSUkpOTdeDAAWVmZsrb21uzZs1S165dG93Xy8HpOADtWlFRkSZOnKikpCSPo55jx47puuuuq3MZwzD07LPPyjAMhYeHa8iQIebpuB++3POHVq1apbvuukt2u71JIXMpISEh5r0+RUVF6t27d73zlpeXa9q0afryyy+1YsUK3X777YqLi9M777zj8eK+s2fPavfu3br99tvNsvT0dMXGxqq8vFzvvPOOHnzwQfPV5K2JEALQJC34BJtWl5OTowcffFDXXXedUlNTJdXcyHnkyBG9/fbb6tu3b61lzp49q4KCAvXq1UubNm3SqVOnzHtnOnfurP3790uqOTV2MWyOHDmiV199VUuXLpVUcy/R3/72tzoD6/vvv9eUKVPMzxePrC6eZvvhPUk/ZBiG/vGPf9T5Spxz585JqrmO4+XlpQULFigoKEj/8z//o5EjR6pPnz569tln9eijj8rlcmnFihWKjo7WNddcY66jpKREd955p37961+rR48eioiIUH5+voKDg+vsT0vhdByAdum9995TTEyMRowYoXXr1pmPtikrK9OYMWNkt9s9nhF30fHjxxUZGam1a9eqU6dOcrvd5kOabTabevbsqeeee06/+MUvdOONN0qS/P39tWDBAt1///2SagY9DBw40Ly36IfTwIEDVVJSYrZXWVkph8Oh8+fP6/z58/r666/Vs2dPs/7YsWO68847df3118vhcHicUrwoIyNDkjR8+HDt2bPHPIIJDQ1Vdna2pkyZoszMTDPoDhw4oMcff1wff/yxhg0bJrfbrXHjxunGG2/UwYMHNW/ePK1Zs0YxMTHq2LGjwsLCdPr06eb+SupkM1ryyXwtyO12Kz8/3+puAK2qBc/aNEpj/7VXVVWZF/K9vLxat1Ot6NixY+aQ46aorKys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",
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "draw_bar(str_stats,token_stats)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "40952475-6de6-49c5-ac6b-ce59552e6b94",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "0ffbaa04bed84e6c87d5e0eb151f1007",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "README.md:   0%|          | 0.00/940 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Users\\MECHREVO\\anaconda3\\Lib\\site-packages\\huggingface_hub\\file_download.py:140: UserWarning: `huggingface_hub` cache-system uses symlinks by default to efficiently store duplicated files but your machine does not support them in C:\\Users\\MECHREVO\\.cache\\huggingface\\hub\\datasets--BelleGroup--train_0.5M_CN. Caching files will still work but in a degraded version that might require more space on your disk. This warning can be disabled by setting the `HF_HUB_DISABLE_SYMLINKS_WARNING` environment variable. For more details, see https://huggingface.co/docs/huggingface_hub/how-to-cache#limitations.\n",
      "To support symlinks on Windows, you either need to activate Developer Mode or to run Python as an administrator. In order to activate developer mode, see this article: https://docs.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development\n",
      "  warnings.warn(message)\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a69e3b490df3473891d6cb9b81471fa6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Belle_open_source_0.5M.json:   0%|          | 0.00/286M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3e7779ae973d439eb9753b5e3d7f845f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Generating train split:   0%|          | 0/519255 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from datasets import load_dataset\n",
    "\n",
    "data = load_dataset('BelleGroup/train_0.5M_CN')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "7b6340c5-9ad7-4ff5-b50b-93b83a858d3f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'instruction': '给定一个文字输入，将其中的所有数字加1。\\n“明天的会议在9点开始，记得准时到达。”\\n',\n",
       " 'input': '',\n",
       " 'output': '“明天的会议在10点开始，记得准时到达。”'}"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['train'][1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "ce28886e-f1f7-4284-9101-91db5c56262a",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_trainging_corpus():\n",
    "    d = data['train'].select(range(10000))\n",
    "    batch_size = 1000\n",
    "    for i in range(0,len(d),batch_size):\n",
    "        samples = d[i:i + batch_size]\n",
    "        yield samples.get('instruction',[])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "4d4f056a-1de7-495c-b5be-1a3e35f9915e",
   "metadata": {},
   "outputs": [],
   "source": [
    "tokenizer_zh = tokenizer_gpt2.train_new_from_iterator(get_trainging_corpus(),1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "1225b203-b7af-4d83-9d1b-9f26cfd5640a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'�_�_�_�_�_里_�_�_特_�_�_�_�_�_�_�_�_�_（_�_�_v_ar_is_t_e_ _G_a_l_o_is_，_1_8_1_1_年_10_月_2_5_日_�_�_1_8_3_2_年_5_月_3_1_日_）_，_法_国_数_学_家_，_现_代_数_学_中的_分_�_�_学_科_�_�_论_的_创_�_�_者_。_他_用_�_�_论_�_�_�_�_解_决_了_根_式_求_解_代_数_方_程_的_问题_，_并_�_�_此_发展_了_一_�_�_�_�_关于_�_�_和_�_�的_理_论_，_人_们_称_之_为_�_�_�_�_�_�_�_理_论_。_�_�_�_�_�_�_�_在_�_�_时_，_他_的_数_学_研_�_�_成_果_的_重要_性_并_未_�_�_人_们_所_认_识_，_他_�_�_�_�_科_学_�_�_提_交_的_三_篇_学_术_论_文_�_�_�_�_�_�_回_或_�_�_�_�_。_后_来_，_他_�_�_�_�_�_�_�_�_，_�_�_持_�_�_和_�_�_，_�_�_两_次_�_�_�_�_。_2_1_�_�_�_时_，_他_在_一_次_决_�_�_中_�_�_生_。'"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 打印中文分词效果\n",
    "'_'.join([tokenizer_zh.decode(i) for i in tokenizer_zh.encode(text_zh)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e9736e3e-d329-4c89-a8a6-3df0d09b4eca",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "210837ed-baec-42d8-968d-04e6ff380d01",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "95042bd1-47bd-4862-9581-61beb0732ef1",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "faf21668-5539-4e0b-8fe3-596d245d1d1d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "82a62519-1bf8-4128-bc83-16e1c33fea93",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6e8394c1-a55c-4ab6-b567-64c6051c51b8",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
